﻿<?php
class Controller {
	public $request;
	public $vars = array();
	public $layout = 'default';
	private $rendered = false;

	public function __construct($request=null){
		if($request)
		$this->request = $request;
		else
		$this->request = $_SERVER['REQUEST_URI'];
	}
	public function render($vue,$pdf=null){
		//protection des pages pour les utilisateurs non connectés
		if(is_a($this,'particulierController') && !isset($_SESSION['email'])){
            $_SESSION['ancien_requete'] = $this->request->url;
			$this->redirect(SITE."#popup_connexion");
		}
		if(is_a($this,'restaurantController') && !isset($_SESSION['email'])){
            $_SESSION['ancien_requete'] = $this->request->url;
			$this->redirect(SITE."#popup_connexion");
		}
		if(is_a($this,'hotelController') && !isset($_SESSION['email'])){
            $_SESSION['ancien_requete'] = $this->request->url;
			$this->redirect(SITE."#popup_connexion");
		}
        if(is_a($this,'fournisseurController') && !isset($_SESSION['email'])){
            $_SESSION['ancien_requete'] = $this->request->url;
            $this->redirect(SITE."#popup_connexion");
        }
        if(is_a($this,'appelOffreController') && !isset($_SESSION['email'])){
            $_SESSION['ancien_requete'] = $this->request->url;
            $this->redirect(SITE."#popup_connexion");
        }
		//l'utilisateur est déjà connecté et qu'il veut acceder à la page de connexion
		//il est automatiquement redirigé vers sa page d'acceuil
		if(is_a($this,'connexionController') && isset($_SESSION['email'])){
			$this->redirect(SITE);
		}
		//Protection des contenues en fonction des utilisateurs
		if(isset($_SESSION['type_utilisateur']) && (get_class($this)!='Controller')){
			if($_SESSION['type_utilisateur'] == 'Restaurant'
				&& !is_a($this,'restaurantController')
				&& !is_a($this,'appelOffreController')
				&& !is_a($this,'MessagesController')
				&& !is_a($this,'gestionController')
				&& !is_a($this,'FichierAppelOffreController')
				&& !is_a($this,'AcceuilController')){
				$this->redirect(SITE);
			} else if($_SESSION['type_utilisateur'] == 'Hotel'
				&& !is_a($this,'HotelController')
				&& !is_a($this,'AppelOffreController')
				&& !is_a($this,'MessagesController')
				&& !is_a($this,'GestionController')
				&& !is_a($this,'FichierAppelOffreController')
				&& !is_a($this,'AcceuilController')){
				$this->redirect(SITE);
			} else if($_SESSION['type_utilisateur'] == 'Particulier'
				&& !is_a($this,'particulierController')
				&& !is_a($this,'MessagesController')
				&& !is_a($this,'RechercheController')
				&& !is_a($this,'FichierAppelOffreController')
				&& !is_a($this,'AcceuilController')){
				$this->redirect(SITE);
            } else if($_SESSION['type_utilisateur'] == 'Fournisseur'
                && !is_a($this,'fournisseurController')
                && !is_a($this,'MessagesController')
                && !is_a($this,'rechercheController')
                && !is_a($this,'FichierAppelOffreController')
                && !is_a($this,'AcceuilController')){
                $this->redirect(SITE);
            } else if($_SESSION['type_utilisateur'] == 'Traiteur'
                && !is_a($this,'TraiteurController')
                && !is_a($this,'MessagesController')
                && !is_a($this,'rechercheController')
                && !is_a($this,'FichierAppelOffreController')
                && !is_a($this,'AcceuilController')){
                $this->redirect(SITE);
			} else {
                if(isset($_SESSION['ancien_requete'])){
                    $url = $_SESSION['ancien_requete'];
                    unset($_SESSION['ancien_requete']);
                    $this->redirect($url);
                }
            }
		}
		if($this->rendered){
			return false;
		}

		extract($this->vars);
		ob_start();
		if(strpos($vue,'/')===0){
			$view = ROOT.DS.'view'.DS.'error'.DS.$vue;
		} else {
			$view = ROOT.DS.'view'.DS.lcfirst($this->request->controller).DS.$vue.'.php';
		}
		require_once $view;

		$content = ob_get_clean();
		//si on doit affciher la page des particulier on change de layout
		//on fait de mm pour l'hotel et restaurant
		if(isset($_SESSION['type_utilisateur']) && ! is_a($this,'AcceuilController')){
			if($_SESSION['type_utilisateur']=="Particulier"){
				$this->layout = 'particulierLayout';
			} else if($_SESSION['type_utilisateur']=="Restaurant"){
				$this->layout = 'restaurantLayout';
			} else if($_SESSION['type_utilisateur']=="Hotel"){
				$this->layout = 'hotelLayout';
            } else if($_SESSION['type_utilisateur']=="Fournisseur"){
                $this->layout = 'fournisseurLayout';
            } else if($_SESSION['type_utilisateur']=="Traiteur"){
                $this->layout = 'traiteurLayout';
            }
		} else {
			$this->layout = 'default';
		}

		require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php';
		$this->rendered = true;

	}

	public function set($key,$value=null){
		if(is_array($key)){
			$this->vars += $key;
		} else {
			$this->vars[$key] = $value;
		}

	}

	public function loadModel($name){
		$file = ROOT.DS.'model'.DS.ucfirst($name).'.php';
		require_once $file;
		$this->$name = new $name();
		return $this->$name;
	}
	/**
	* 	Permert d'appeler un controller depuis une vue
	**/
	public function request($controller,$action){
		$controller.='Controller';
		require_once ROOT.DS.'controller'.DS.$controller.'.php';
		$c = new $controller();
		return $c->$action();
	}

	public function modifierCompte(){

		if(isset($_POST['modifierCompte'])){
			$new_email = $_POST['email'];
			$old_email = $_SESSION['email'];
			$new_password = $_POST['newPassword']=="" ? $_SESSION['password'] : sha1($_POST['newPassword']) ;
			$old_password = sha1($_POST['oldPassword']);
			$model = $this->loadModel('utilisateurManager');
			$model->updateEmailPassword($new_email,$new_password,$_SESSION['id_utilisateur']);

			if($new_email == $old_email && $new_password == $old_password){
				return 'Aucune modification éffectué , votre adresse mail et mot de passe n\'ont pas changer!';
			} else {
				$_SESSION['email'] = $new_email;
				$_SESSION['password'] = $new_password;
				return 'Modifications éffectuées , vous pouvez utiliser à présent votre nouveau adresse mail et mot de passe';
			}

		}
	}

	public function getListeAppelOffre($type_appel_offre,$id_appel=null){
		$model = $this->loadModel('appelOffreManager');
		return $model->getListeAppelOffre($this->request,$type_appel_offre,$id_appel);
	}

	public function getDetailsAppelOffre($id_appel_offre,$type_appel_offre){
		$model = $this->loadModel('appelOffreManager');
		return $model->getDetailsAppelOffre($id_appel_offre,$type_appel_offre);
	}

	public function addDevis($type_appel_offre,$nom_fichier){
		$erreurs = array();
		if(isset($_POST['devisAppelResto']) || isset($_POST['devisAppelHotel']) ){
			$model = $this->loadModel('appelOffreManager');
			$prix_devis = intval($_POST['prix']);
			$details_devis = htmlentities($_POST['details']);
			$id_appel_offre = isset($this->request->params[1]) ? intval($this->request->params[1]) : "";
			$id_utilisateur = $_SESSION['id_utilisateur'];

			if($model->idExist($id_appel_offre,$type_appel_offre)){

				if( ! $model->devisExist($id_appel_offre,$id_utilisateur)){
					$erreurs = $this->uploadFichierDevis($nom_fichier,null,true);
					if(empty($erreurs)){
						$donnee = $model->addDevis($id_appel_offre,$id_utilisateur,$type_appel_offre,$prix_devis,
						$details_devis);
						$id = $model->pdo->lastInsertId();
						$appel_offre = $model->getDetailsAppelOffre($id_appel_offre,$type_appel_offre);
						$model_msg = $this->loadModel('messagesManager');
						$id_destinateur = $appel_offre->id_particulier;
						$id_expediteur = 0;
						$sujet = 'Reception de devis';
						$contenu = $this->getTextReceptionDevis($appel_offre,$id,$id_utilisateur);
						$model_msg->sendMessages($id_expediteur,$id_destinateur,$sujet,$contenu);
						//on sauvegarde le fichier du devis s'il n'y a pas eu d'erreurs
						if(strlen($_FILES[$nom_fichier]['name'])>0){
							$extension_fichier = strtolower(strrchr($_FILES[$nom_fichier]['name'],'.'));
							$chemin = WEBROOT.DS.'fichier_appel_offre'.DS.$id.$extension_fichier;
							$erreurs = $this->uploadFichierDevis($nom_fichier,$chemin);
							$model->updateDevis($id,'fichier',$chemin);
						}

						if(empty($donnee))
							$erreurs['erreurs'] = true;
					}

				} else {
					$erreurs['devis_exist'] = true;
				}

			} else {
				$erreurs['id'] = true;
			}
			return $erreurs;
		}
	}

	public function redirect($url,$code=null){
		if($code==301){
			header('HTTP/1.1 301 Moved Permanently');
		}
		header("Location: ".$url);
		exit;
	}

	function VerifTel($chaine){
		$regex = "#^0[1-68]([-. ]?[0-9]{2}){4}$#";
		if (preg_match($regex,$chaine)){
			return true;
		}
		return false;
	}
	function verifEmail($mail){
		return filter_var($mail,FILTER_VALIDATE_EMAIL);
	}

	function getNombreMessages(){
		if(isset($_SESSION['email'])){
			$model = $this->loadModel('messagesManager');
			return $model->getNombreMessages($_SESSION['id_utilisateur']);
		}
	}

	function dateDataBase($date){
		if(strlen($date)>=8){
		$tab = explode('/',$date);
		$jour = $tab[0];
		$mois = isset($tab[1]) ? $tab[1] : "";
		$annee = isset($tab[2]) ? $tab[2] : "";
		if(strlen($jour)==1)
			$jour = "0".$jour;
		if(strlen($mois)==1)
			$jour = "0".$mois;
		$chaine = $annee."-".$mois."-".$jour;
		return $chaine;
	}
	}

	public function uploadFichierDevis($nom,$chemin=null,$verifier=null){
		$erreurs = array();

		if(isset($_FILES[$nom]) && strlen($_FILES[$nom]['name'])>0){
			$extension_valide = array('.pdf','.docx','.txt','.doc');
			$nom_fichier = basename($_FILES[$nom]['name']);
			$extension_fichier = strtolower(strrchr($_FILES[$nom]['name'],'.'));
			$taille_fichier = filesize($_FILES[$nom]['tmp_name']);
			if($_FILES[$nom]['error']==UPLOAD_ERR_NO_FILE){
				$erreurs['fichiers'] = 'Fichier introuvable .';
			} else if($_FILES[$nom]['error']==UPLOAD_ERR_INI_SIZE || $_FILES[$nom]['error']==UPLOAD_ERR_FORM_SIZE
				|| $taille_fichier>1000000){
				$erreurs['fichiers'] = 'Fichier trop volumineux .';
			} else if($_FILES[$nom]['error']==UPLOAD_ERR_PARTIAL){
				$erreurs['fichiers'] = 'Fichier déplacer partiellement .';
			} else if(!in_array($extension_fichier,$extension_valide)) {
				$erreurs['fichiers'] = 'Fichier non valide , veuillez choisir un fichier au format indiqué .';
			} else if(!isset($verifier)){
				$bool = move_uploaded_file($_FILES[$nom]['tmp_name'],$chemin);
				if(! $bool)
					$erreurs['fichiers'] = 'Erreurs lors du transfert, veuillez récommencer .';
			}
		}
		return $erreurs;
	}
	public function getTextReceptionDevis($appel_offre,$id_devis,$id_utilisateur){
		$dateTime = formateDateTime($appel_offre->date_ajout);
		$url = SITE.'particulier/gestionDevis/';
		$url_gestion = SITE.'particulier/gestionDevis/';
		if(isset($appel_offre->nombre_chambre)){
			$url.='hebergement/'	;
		} else {
			$url.='restauration/';
		}
		$url.=$appel_offre->id_appel_offre.'/'.$id_devis.'/'.$id_utilisateur;
		$contenu = "Cher client vous avez réçus un devis de la part d'un professionnel .<br/>
		<strong>Titre de l'appel d'offre : ".$appel_offre->titre_appel_offre." <br/>
		<em>Publié le ".$dateTime['jour'].'/'.$dateTime['mois'].'/'.$dateTime['annee'].' à '.$dateTime['heure'].
		':'.$dateTime['minute'].':'.$dateTime['seconde']."</em></strong><br/>
		Vous pouvez acceder au details du devis en cliquant sur le lien suivant <strong><a href='{$url}'>Details du devis
		</a></strong><br /> ou en allant dans la section <a href='{$url_gestion}'>Gestions des devis</a> .<br/>";
		return $contenu;
	}

	public function getTextRefusDevis(){

	}

	public function getTextAcceptDevis(){

	}

	public function renderErreur404(){
		$this->render('/404.php');
	}

	public function getFileAriane(){
		$file_ariane = "Vous êtes ici &nbsp;&nbsp;<strong> >> </strong>";
		if(is_a($this,'AcceuilController')){
			if($this->request->action=="index" or $this->request->action=="acceuil"){
				$file_ariane.= '<a href="'.SITE.'">Acceuil</a>';
			}
		}
		return $file_ariane;
	}

	public function getListeImages(){
		if($this->request->action==__FUNCTION__){
			$this->renderErreur404();
		} else {
			$model = $this->loadModel('ServiceManager');
			return $model->getListeImages();
		}
	}

	public function getNombreDevis($type_appel_offre,$id_appel_offre){
		if($this->request->action!=__FUNCTION__){
			$model = $this->loadModel('appelOffreManager');
			$id_appel_offre = htmlentities($id_appel_offre);
			return $model->getNombreDevis($type_appel_offre,$id_appel_offre);
		} else {
			//la fonction ne doit pas être appeler comme action
			$this->renderErreur404();
		}

	}
}